package guda.demox.web.test;


import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.webapp.WebAppContext;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.*;

/**
 * Created by well on 15/3/13.
 */
public class JettyServerWithEclipse {

    //jetty容器监听的端口，可以随意修改
    private int jettyPort = 9898;
    //auto-config默认配置文件在~/下面
    private String autoConfigName = "demox-local.properties";

    /**
     * 注意事项：
     * <p>
     * webapp目录，同时用来定位web.xml，是相对项目主控pom的目录
     * </p>
     * 1,webappDir目录问题：
     *   如果是idea开发，保持现状即可，如果用eclipse开发，注意这里应该改成<br>
     *    webappDir = src/main/webapp,也就是需要去掉(stark-web)这一层目录。原因是eclipse的user.dir是当前工程pom的目录，而idea是主控pom的目录
     * 2，属性配置文件app-(dev|test|local|pro).properties无法找到的问题，或者替换不正确的问题
     *    如果是idea在导入工程的时候，（如果没记错应该是第三步）不要选择任何默认的配置文件，如果选择了idea在工程编译的会自动使用选择的配置文件替换XML中的placeholder
     * 上面都是废话
     *  如果是idea开发  devTools = DevTools.idea;
     *  如果是 eclipse开发，devTools = DevTools.eclipse;
     */
    private DevTools  devTools = DevTools.idea;


    /**
     * =====以下都不需要修改，没有个性化的设置＝＝＝＝＝＝＝＝＝＝＝
     */

    private String ideaWebappDir = "demox-web/src/main/webapp";
    private String eclipseWebAppDir = "src/main/webapp";
    private String ideaStaticDir = System.getProperty("user.dir") + File.separatorChar + "assets" + File.separator+"app";


    public static void main(String[] args) throws Exception {
        JettyServerWithEclipse jetty = new JettyServerWithEclipse();
        jetty.start();
    }

    public void start() throws Exception {
        //warn  开发环境，建议从自己本地用户目录下加载配置文件，这样自己本地配置不用同步到git或者SVN上
        loadProperties();
        Server server = new Server(jettyPort);
        HandlerCollection collection = new HandlerCollection();

        ResourceHandler resourceHandler = new ResourceHandler();
        resourceHandler.setDirectoriesListed(true);
        if(devTools == DevTools.eclipse) {
            String property = System.getProperty("user.dir");
            File file = new File(property);
            String parent = file.getParent();
            String staticDir = parent + File.separatorChar + "assets" + File.separator + "app";
            resourceHandler.setResourceBase(staticDir);
        }else{
            resourceHandler.setResourceBase(ideaStaticDir);
        }
        collection.addHandler(resourceHandler);

        collection.addHandler(createWebapp());

        server.setHandler(collection);
        server.start();
        server.join();
    }

    private void loadProperties() {
        File file = new File(System.getProperty("user.home") + File.separatorChar + autoConfigName);
        if (file.canRead()) {
            try {
                System.out.println("=====环境变量========");
                System.getProperties().load(new FileInputStream(file));
                Set<Object> objects = System.getProperties().keySet();
                List keyList = new ArrayList();
                keyList.addAll(objects);
                Collections.sort(keyList);
                Iterator iterator = keyList.iterator();
                while (iterator.hasNext()) {
                    Object key = iterator.next();
                    System.out.println(key + "=" + System.getProperties().get(key));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    private void loadPropertiesFromClasspath() {
        InputStream resourceAsStream = this.getClass().getResourceAsStream("/"+autoConfigName);
        //File file = new File(System.getProperty("user.home") + File.separatorChar + autoConfigName);

        try {
            System.out.println("=====环境变量========");
            System.getProperties().load(resourceAsStream);
            Set<Object> objects = System.getProperties().keySet();
            List keyList = new ArrayList();
            keyList.addAll(objects);
            Collections.sort(keyList);
            Iterator iterator = keyList.iterator();
            while (iterator.hasNext()) {
                Object key = iterator.next();
                System.out.println(key + "=" + System.getProperties().get(key));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    protected WebAppContext createWebapp() {
        WebAppContext webapp = new WebAppContext();
        webapp.setDescriptor(getWebDescriptor());
        if(devTools == DevTools.eclipse) {
            webapp.setResourceBase(getAppRoot() + File.separatorChar + eclipseWebAppDir);
        }else{
            webapp.setResourceBase(getAppRoot() + File.separatorChar + ideaWebappDir);
        }
        webapp.setContextPath("/");
        webapp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
        webapp.setInitParameter("org.eclipse.jetty.servlet.Default.useFileMappedBuffer", "false");
        return webapp;
    }


    private String getWebDescriptor() {
        if(devTools == DevTools.eclipse) {
            return getAppRoot() + File.separatorChar + eclipseWebAppDir + File.separatorChar + "WEB-INF" + File.separatorChar + "web.xml";
        }else{
            return getAppRoot() + File.separatorChar + ideaWebappDir + File.separatorChar + "WEB-INF" + File.separatorChar + "web.xml";
        }
    }


    protected String getAppRoot() {
        return System.getProperty("user.dir");
    }

    static enum DevTools{
        idea,
        eclipse
    }


}
